From b0e7abf2a6bc95b999d4377afead775f5080d135 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C3=98yvind=20Kol=C3=A5s?= Date: Fri, 13 Jan 2017 03:45:35 +0100 Subject: [PATCH] extensions/CIE: do cbrt computation in single precision float This is sufficient for our purposes, and gives a ~40% boost for the affecte CIE Lab float conversions. --- extensions/CIE.c | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/extensions/CIE.c b/extensions/CIE.c index fa9df11..e1e2fa7 100644 --- a/extensions/CIE.c +++ b/extensions/CIE.c @@ -472,7 +472,7 @@ B2 = 642849266; /* B2 = (127-127.0/3-24/3-0.03306235651)*2**23 */ static inline float _cbrtf(float x) { - double_t r,T; + float r,T; union {float f; uint32_t i;} u = {x}; uint32_t hx = u.i & 0x7fffffff; @@ -491,23 +491,13 @@ static inline float _cbrtf(float x) u.i &= 0x80000000; u.i |= hx; - /* - * First step Newton iteration (solving t*t-x/t == 0) to 16 bits. In - * double precision so that its terms can be arranged for efficiency - * without causing overflow or underflow. - */ T = u.f; r = T*T*T; - T = T*((double_t)x+x+r)/(x+r+r); + T = T*((float)x+x+r)/(x+r+r); - /* - * Second step Newton iteration to 47 bits. In double precision for - * efficiency and accuracy. - */ r = T*T*T; - T = T*((double_t)x+x+r)/(x+r+r); + T = T*((float)x+x+r)/(x+r+r); - /* rounding to 24 bits is perfect in round-to-nearest mode */ return T; } -- 2.30.2